package com.base.listNode;

import java.util.Deque;
import java.util.LinkedList;
import java.util.Queue;

/**
 * 430. 扁平化多级双向链表
 * <p>
 * 多级双向链表中，除了指向下一个节点和前一个节点指针之外，它还有一个子链表指针，可能指向单独的双向链表。这些子列表也可能会有一个或多个自己的子项，依此类推，生成多级数据结构，如下面的示例所示。
 * <p>
 * 给你位于列表第一级的头节点，请你扁平化列表，使所有结点出现在单级双链表中。
 * <p>
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/flatten-a-multilevel-doubly-linked-list
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 *
 * @author leon
 * @date 2021年09月24日 13:06
 */
public class Flatten {
    class Node {
        public int val;
        public Node prev;
        public Node next;
        public Node child;
    }

    /**
     * 深度优先遍历：
     * 可以将其看作一颗树,next是右结点，child是左结点,然后先序遍历
     *  TODO 第一个代码还有问题
     * @param head 头结点
     * @return 单链表
     */
    public Node flatten(Node head) {
        Node ret = new Node();
        Node dummy = ret;
        dfs1(head,ret);
        dummy.next.prev = null;
        return dummy.next;



    }

    public void dfs1(Node head,Node ret) {
        if (head == null){
            return;
        }
        ret.next =head;
        head.prev = ret;
        ret = ret.next;
        dfs1(head.child,ret);
        dfs1(head.next,ret);
    }


    public Node flatten1(Node head) {
        dfs(head);
        return head;
    }

    public Node dfs(Node node) {
        Node cur = node;
        // 记录链表的最后一个节点
        Node last = null;

        while (cur != null) {
            Node next = cur.next;
            //  如果有子节点，那么首先处理子节点
            if (cur.child != null) {
                Node childLast = dfs(cur.child);

                next = cur.next;
                //  将 node 与 child 相连
                cur.next = cur.child;
                cur.child.prev = cur;

                //  如果 next 不为空，就将 last 与 next 相连
                if (next != null) {
                    childLast.next = next;
                    next.prev = childLast;
                }

                // 将 child 置为空
                cur.child = null;
                last = childLast;
            } else {
                last = cur;
            }
            cur = next;
        }
        return last;
    }
//
//    作者：LeetCode-Solution
//    链接：https://leetcode-cn.com/problems/flatten-a-multilevel-doubly-linked-list/solution/bian-ping-hua-duo-ji-shuang-xiang-lian-b-383h/
//    来源：力扣（LeetCode）
//    著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。
}
